Przykad 10.2. Realizacja wedug pomysu Knutha randomizowanego oszacowania problemu n krlowych
/**
 * Na szachownicy n na n rozstaw do n krlowych w sposb nie zagraajcy
 * i zrealizuj przeszukanie wzdu tras wytyczonych przez losowy spacer
 * Knutha. Zakada si, e krlowe s dodawane w rzdach, zaczynajc od 0.
 */
public class Board {
   boolean [][] board;   /** Szachownica */
   final int n;         /** Rozmiar szachownicy */

   /** Czasowo zapamitaj ostatnie dopuszczalne pozycje */
   ArrayList<Integer> nextValidRowPositions = new ArrayList<Integer>();

   public Board (int n) {
      board = new boolean[n][n];
      this.n = n;
   }

   /** Zacznij od rzdu i postpuj w gr, sprawdzajc dopuszczalno */
   private boolean valid (int row, int col) {
      // Inna krlowa w tej samej kolumnie, na lewej lub na prawej przektnej?
      int d = 0;
      while (++d <= row) {
         if (board[row d][col]) { return false; } // kolumna
         if (col >= d && board[row d][col d]) { return false; }  // lewa p.
         if (col+d < n && board[row d][col+d]) { return false; }  // prawa p.
      }
      return true; // OK
   }

   /**
    * Znajd liczb poprawnych stanw potomnych, prbujc postawi
    * krlow w danym rzdzie. Zwraca liczb od 0 do n
    */
   public int numChildren(int row) {
      int count = 0;
      nextValidRowPositions.clear();
      for (int i = 0; i < n; i++) {
         board[row][i] = true;
         if (valid(row, i)) {
            count++;
            nextValidRowPositions.add(i);
         }
         board[row][i] = false;
      }

      return count;
   }

   /** Jeli w tym rzdzie nie ma dobrego ustawienia, zwr "false" */
   public boolean randomNextBoard(int r) {
      int sz = nextValidRowPositions.size();
      if (sz == 0) { return false; }

      // Wybierz jedn losowo
      int c = ((int)(Math.random()*sz));
      board[r][nextValidRowPositions.get(c)] = true;
      return true;
   }
}

public class SingleQuery {

   public static void main (String [] args) {
      for (int i = 0; i < 100; i++) {
         System.out.println(i + ": " + estimate(19));
      }
   }

   public static long estimate (int n) {
      Board b = new Board(n);

      int r = 0;
      long lastEstimate = 1;
      while (r < n) {
         int numChildren = b.numChildren(r);

         // Nie ma dokd dalej i  nie znaleziono rozwizania
         if (!b.randomNextBoard(r)) {
            lastEstimate = 0;
            break;
         }

         // Oblicz oszacowanie na podstawie biecej historii
         // i id dalej
         lastEstimate = lastEstimate*numChildren;
         r++;
      }

      return lastEstimate;
   }
}
